composite variable
All variables of a given composite type are the same size.  This is important, because locating composite variables within disk files is enormously simpler with fixed-size records.

Composite variables are declared in type declaration statements, just like other variables, with the composite type name replacing the built-in type name.  For example:

  SHARED DOUBLE xx, yy, zz[]           ' declare conventional variables
  SHARED VICTIM last, current, all[]  ' declare composite variables
  DCOMPLEX nn, oo, jj[]                ' declare composite variables
  STATIC VICTIM first, last, sorted[] ' declare composite variables

component
Components of composite variables are accessed by appending component names, which always begins with ., to the composite variable name, as in employee.phone where employee is a composite variable and .phone is the name of a component.  Dots are not valid characters in other symbols, so component names are easy to distinguish from normal symbols.

SCOMPLEX and DCOMPLEX
Two complex number composite types are predefined for all programs, SCOMPLEX and DCOMPLEX.  SCOMPLEX has two SINGLE components, while DCOMPLEX has two DOUBLE components.  For both complex types, the component names are .R and .I , and contain the real and imaginary parts.

The + , - , * , and / operators can operate on complex variables, so expressions like:

  xx = (xx * yy) + (yy / zz)

are valid (where xx , yy , zz are all SCOMPLEX or DCOMPLEX).  The components of complex numbers are accessed like any composite variable, as in:

  xx.R = j#
  k# = xx.I
  yy.I = zz.I

Functions can take composite variables arguments, and/or return composite results.  Dozens of SCOMPLEX and DCOMPLEX functions are provided in the complex number function library.